package de.fhdw.seminar.xtext.parser.antlr.internal; 

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import de.fhdw.seminar.xtext.services.UmlDslGrammarAccess;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings("all")
public class InternalUmlDslParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_INT", "RULE_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'abstract'", "'class'", "'extends'", "'{'", "'}'", "':'", "'*'", "'Boolean'", "'Integer'", "'String'"
    };
    public static final int RULE_ID=4;
    public static final int RULE_ANY_OTHER=10;
    public static final int T__20=20;
    public static final int EOF=-1;
    public static final int RULE_SL_COMMENT=8;
    public static final int RULE_ML_COMMENT=7;
    public static final int T__19=19;
    public static final int RULE_STRING=6;
    public static final int T__16=16;
    public static final int T__15=15;
    public static final int T__18=18;
    public static final int T__17=17;
    public static final int T__12=12;
    public static final int T__11=11;
    public static final int T__14=14;
    public static final int T__13=13;
    public static final int RULE_INT=5;
    public static final int RULE_WS=9;

    // delegates
    // delegators


        public InternalUmlDslParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalUmlDslParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

    public String[] getTokenNames() { return InternalUmlDslParser.tokenNames; }
    public String getGrammarFileName() { return "../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g"; }



     	private UmlDslGrammarAccess grammarAccess;
     	
        public InternalUmlDslParser(TokenStream input, UmlDslGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }
        
        @Override
        protected String getFirstRuleName() {
        	return "UmlModel";	
       	}
       	
       	@Override
       	protected UmlDslGrammarAccess getGrammarAccess() {
       		return grammarAccess;
       	}



    // $ANTLR start "entryRuleUmlModel"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:68:1: entryRuleUmlModel returns [EObject current=null] : iv_ruleUmlModel= ruleUmlModel EOF ;
    public final EObject entryRuleUmlModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUmlModel = null;


        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:69:2: (iv_ruleUmlModel= ruleUmlModel EOF )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:70:2: iv_ruleUmlModel= ruleUmlModel EOF
            {
             newCompositeNode(grammarAccess.getUmlModelRule()); 
            pushFollow(FOLLOW_ruleUmlModel_in_entryRuleUmlModel75);
            iv_ruleUmlModel=ruleUmlModel();

            state._fsp--;

             current =iv_ruleUmlModel; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleUmlModel85); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUmlModel"


    // $ANTLR start "ruleUmlModel"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:77:1: ruleUmlModel returns [EObject current=null] : ( (lv_classes_0_0= ruleUmlClass ) )* ;
    public final EObject ruleUmlModel() throws RecognitionException {
        EObject current = null;

        EObject lv_classes_0_0 = null;


         enterRule(); 
            
        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:80:28: ( ( (lv_classes_0_0= ruleUmlClass ) )* )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:81:1: ( (lv_classes_0_0= ruleUmlClass ) )*
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:81:1: ( (lv_classes_0_0= ruleUmlClass ) )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( ((LA1_0>=11 && LA1_0<=12)) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:82:1: (lv_classes_0_0= ruleUmlClass )
            	    {
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:82:1: (lv_classes_0_0= ruleUmlClass )
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:83:3: lv_classes_0_0= ruleUmlClass
            	    {
            	     
            	    	        newCompositeNode(grammarAccess.getUmlModelAccess().getClassesUmlClassParserRuleCall_0()); 
            	    	    
            	    pushFollow(FOLLOW_ruleUmlClass_in_ruleUmlModel130);
            	    lv_classes_0_0=ruleUmlClass();

            	    state._fsp--;


            	    	        if (current==null) {
            	    	            current = createModelElementForParent(grammarAccess.getUmlModelRule());
            	    	        }
            	           		add(
            	           			current, 
            	           			"classes",
            	            		lv_classes_0_0, 
            	            		"UmlClass");
            	    	        afterParserOrEnumRuleCall();
            	    	    

            	    }


            	    }
            	    break;

            	default :
            	    break loop1;
                }
            } while (true);


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUmlModel"


    // $ANTLR start "entryRuleUmlClass"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:107:1: entryRuleUmlClass returns [EObject current=null] : iv_ruleUmlClass= ruleUmlClass EOF ;
    public final EObject entryRuleUmlClass() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUmlClass = null;


        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:108:2: (iv_ruleUmlClass= ruleUmlClass EOF )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:109:2: iv_ruleUmlClass= ruleUmlClass EOF
            {
             newCompositeNode(grammarAccess.getUmlClassRule()); 
            pushFollow(FOLLOW_ruleUmlClass_in_entryRuleUmlClass166);
            iv_ruleUmlClass=ruleUmlClass();

            state._fsp--;

             current =iv_ruleUmlClass; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleUmlClass176); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUmlClass"


    // $ANTLR start "ruleUmlClass"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:116:1: ruleUmlClass returns [EObject current=null] : ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( ( (lv_associations_6_0= ruleUmlAssociation ) ) | ( (lv_attributes_7_0= ruleUmlAttribute ) ) )* otherlv_8= '}' ) ;
    public final EObject ruleUmlClass() throws RecognitionException {
        EObject current = null;

        Token lv_isAbstract_0_0=null;
        Token otherlv_1=null;
        Token lv_name_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_8=null;
        EObject lv_associations_6_0 = null;

        EObject lv_attributes_7_0 = null;


         enterRule(); 
            
        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:119:28: ( ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( ( (lv_associations_6_0= ruleUmlAssociation ) ) | ( (lv_attributes_7_0= ruleUmlAttribute ) ) )* otherlv_8= '}' ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:120:1: ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( ( (lv_associations_6_0= ruleUmlAssociation ) ) | ( (lv_attributes_7_0= ruleUmlAttribute ) ) )* otherlv_8= '}' )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:120:1: ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( ( (lv_associations_6_0= ruleUmlAssociation ) ) | ( (lv_attributes_7_0= ruleUmlAttribute ) ) )* otherlv_8= '}' )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:120:2: ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= RULE_ID ) ) (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? otherlv_5= '{' ( ( (lv_associations_6_0= ruleUmlAssociation ) ) | ( (lv_attributes_7_0= ruleUmlAttribute ) ) )* otherlv_8= '}'
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:120:2: ( (lv_isAbstract_0_0= 'abstract' ) )?
            int alt2=2;
            int LA2_0 = input.LA(1);

            if ( (LA2_0==11) ) {
                alt2=1;
            }
            switch (alt2) {
                case 1 :
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:121:1: (lv_isAbstract_0_0= 'abstract' )
                    {
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:121:1: (lv_isAbstract_0_0= 'abstract' )
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:122:3: lv_isAbstract_0_0= 'abstract'
                    {
                    lv_isAbstract_0_0=(Token)match(input,11,FOLLOW_11_in_ruleUmlClass219); 

                            newLeafNode(lv_isAbstract_0_0, grammarAccess.getUmlClassAccess().getIsAbstractAbstractKeyword_0_0());
                        

                    	        if (current==null) {
                    	            current = createModelElement(grammarAccess.getUmlClassRule());
                    	        }
                           		setWithLastConsumed(current, "isAbstract", true, "abstract");
                    	    

                    }


                    }
                    break;

            }

            otherlv_1=(Token)match(input,12,FOLLOW_12_in_ruleUmlClass245); 

                	newLeafNode(otherlv_1, grammarAccess.getUmlClassAccess().getClassKeyword_1());
                
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:139:1: ( (lv_name_2_0= RULE_ID ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:140:1: (lv_name_2_0= RULE_ID )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:140:1: (lv_name_2_0= RULE_ID )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:141:3: lv_name_2_0= RULE_ID
            {
            lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUmlClass262); 

            			newLeafNode(lv_name_2_0, grammarAccess.getUmlClassAccess().getNameIDTerminalRuleCall_2_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getUmlClassRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_2_0, 
                    		"ID");
            	    

            }


            }

            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:157:2: (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )?
            int alt3=2;
            int LA3_0 = input.LA(1);

            if ( (LA3_0==13) ) {
                alt3=1;
            }
            switch (alt3) {
                case 1 :
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:157:4: otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) )
                    {
                    otherlv_3=(Token)match(input,13,FOLLOW_13_in_ruleUmlClass280); 

                        	newLeafNode(otherlv_3, grammarAccess.getUmlClassAccess().getExtendsKeyword_3_0());
                        
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:161:1: ( (otherlv_4= RULE_ID ) )
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:162:1: (otherlv_4= RULE_ID )
                    {
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:162:1: (otherlv_4= RULE_ID )
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:163:3: otherlv_4= RULE_ID
                    {

                    			if (current==null) {
                    	            current = createModelElement(grammarAccess.getUmlClassRule());
                    	        }
                            
                    otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUmlClass300); 

                    		newLeafNode(otherlv_4, grammarAccess.getUmlClassAccess().getSuperTypeUmlClassCrossReference_3_1_0()); 
                    	

                    }


                    }


                    }
                    break;

            }

            otherlv_5=(Token)match(input,14,FOLLOW_14_in_ruleUmlClass314); 

                	newLeafNode(otherlv_5, grammarAccess.getUmlClassAccess().getLeftCurlyBracketKeyword_4());
                
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:178:1: ( ( (lv_associations_6_0= ruleUmlAssociation ) ) | ( (lv_attributes_7_0= ruleUmlAttribute ) ) )*
            loop4:
            do {
                int alt4=3;
                int LA4_0 = input.LA(1);

                if ( (LA4_0==RULE_ID) ) {
                    int LA4_2 = input.LA(2);

                    if ( (LA4_2==16) ) {
                        int LA4_3 = input.LA(3);

                        if ( (LA4_3==RULE_ID) ) {
                            alt4=1;
                        }
                        else if ( ((LA4_3>=18 && LA4_3<=20)) ) {
                            alt4=2;
                        }


                    }


                }


                switch (alt4) {
            	case 1 :
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:178:2: ( (lv_associations_6_0= ruleUmlAssociation ) )
            	    {
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:178:2: ( (lv_associations_6_0= ruleUmlAssociation ) )
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:179:1: (lv_associations_6_0= ruleUmlAssociation )
            	    {
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:179:1: (lv_associations_6_0= ruleUmlAssociation )
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:180:3: lv_associations_6_0= ruleUmlAssociation
            	    {
            	     
            	    	        newCompositeNode(grammarAccess.getUmlClassAccess().getAssociationsUmlAssociationParserRuleCall_5_0_0()); 
            	    	    
            	    pushFollow(FOLLOW_ruleUmlAssociation_in_ruleUmlClass336);
            	    lv_associations_6_0=ruleUmlAssociation();

            	    state._fsp--;


            	    	        if (current==null) {
            	    	            current = createModelElementForParent(grammarAccess.getUmlClassRule());
            	    	        }
            	           		add(
            	           			current, 
            	           			"associations",
            	            		lv_associations_6_0, 
            	            		"UmlAssociation");
            	    	        afterParserOrEnumRuleCall();
            	    	    

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:197:6: ( (lv_attributes_7_0= ruleUmlAttribute ) )
            	    {
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:197:6: ( (lv_attributes_7_0= ruleUmlAttribute ) )
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:198:1: (lv_attributes_7_0= ruleUmlAttribute )
            	    {
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:198:1: (lv_attributes_7_0= ruleUmlAttribute )
            	    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:199:3: lv_attributes_7_0= ruleUmlAttribute
            	    {
            	     
            	    	        newCompositeNode(grammarAccess.getUmlClassAccess().getAttributesUmlAttributeParserRuleCall_5_1_0()); 
            	    	    
            	    pushFollow(FOLLOW_ruleUmlAttribute_in_ruleUmlClass363);
            	    lv_attributes_7_0=ruleUmlAttribute();

            	    state._fsp--;


            	    	        if (current==null) {
            	    	            current = createModelElementForParent(grammarAccess.getUmlClassRule());
            	    	        }
            	           		add(
            	           			current, 
            	           			"attributes",
            	            		lv_attributes_7_0, 
            	            		"UmlAttribute");
            	    	        afterParserOrEnumRuleCall();
            	    	    

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop4;
                }
            } while (true);

            otherlv_8=(Token)match(input,15,FOLLOW_15_in_ruleUmlClass377); 

                	newLeafNode(otherlv_8, grammarAccess.getUmlClassAccess().getRightCurlyBracketKeyword_6());
                

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUmlClass"


    // $ANTLR start "entryRuleUmlAssociation"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:227:1: entryRuleUmlAssociation returns [EObject current=null] : iv_ruleUmlAssociation= ruleUmlAssociation EOF ;
    public final EObject entryRuleUmlAssociation() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUmlAssociation = null;


        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:228:2: (iv_ruleUmlAssociation= ruleUmlAssociation EOF )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:229:2: iv_ruleUmlAssociation= ruleUmlAssociation EOF
            {
             newCompositeNode(grammarAccess.getUmlAssociationRule()); 
            pushFollow(FOLLOW_ruleUmlAssociation_in_entryRuleUmlAssociation413);
            iv_ruleUmlAssociation=ruleUmlAssociation();

            state._fsp--;

             current =iv_ruleUmlAssociation; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleUmlAssociation423); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUmlAssociation"


    // $ANTLR start "ruleUmlAssociation"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:236:1: ruleUmlAssociation returns [EObject current=null] : ( ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (otherlv_2= RULE_ID ) ) ( (lv_isMany_3_0= '*' ) )? ) ;
    public final EObject ruleUmlAssociation() throws RecognitionException {
        EObject current = null;

        Token lv_name_0_0=null;
        Token otherlv_1=null;
        Token otherlv_2=null;
        Token lv_isMany_3_0=null;

         enterRule(); 
            
        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:239:28: ( ( ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (otherlv_2= RULE_ID ) ) ( (lv_isMany_3_0= '*' ) )? ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:240:1: ( ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (otherlv_2= RULE_ID ) ) ( (lv_isMany_3_0= '*' ) )? )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:240:1: ( ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (otherlv_2= RULE_ID ) ) ( (lv_isMany_3_0= '*' ) )? )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:240:2: ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (otherlv_2= RULE_ID ) ) ( (lv_isMany_3_0= '*' ) )?
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:240:2: ( (lv_name_0_0= RULE_ID ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:241:1: (lv_name_0_0= RULE_ID )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:241:1: (lv_name_0_0= RULE_ID )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:242:3: lv_name_0_0= RULE_ID
            {
            lv_name_0_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUmlAssociation465); 

            			newLeafNode(lv_name_0_0, grammarAccess.getUmlAssociationAccess().getNameIDTerminalRuleCall_0_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getUmlAssociationRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_0_0, 
                    		"ID");
            	    

            }


            }

            otherlv_1=(Token)match(input,16,FOLLOW_16_in_ruleUmlAssociation482); 

                	newLeafNode(otherlv_1, grammarAccess.getUmlAssociationAccess().getColonKeyword_1());
                
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:262:1: ( (otherlv_2= RULE_ID ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:263:1: (otherlv_2= RULE_ID )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:263:1: (otherlv_2= RULE_ID )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:264:3: otherlv_2= RULE_ID
            {

            			if (current==null) {
            	            current = createModelElement(grammarAccess.getUmlAssociationRule());
            	        }
                    
            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUmlAssociation502); 

            		newLeafNode(otherlv_2, grammarAccess.getUmlAssociationAccess().getTypeUmlClassCrossReference_2_0()); 
            	

            }


            }

            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:275:2: ( (lv_isMany_3_0= '*' ) )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==17) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:276:1: (lv_isMany_3_0= '*' )
                    {
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:276:1: (lv_isMany_3_0= '*' )
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:277:3: lv_isMany_3_0= '*'
                    {
                    lv_isMany_3_0=(Token)match(input,17,FOLLOW_17_in_ruleUmlAssociation520); 

                            newLeafNode(lv_isMany_3_0, grammarAccess.getUmlAssociationAccess().getIsManyAsteriskKeyword_3_0());
                        

                    	        if (current==null) {
                    	            current = createModelElement(grammarAccess.getUmlAssociationRule());
                    	        }
                           		setWithLastConsumed(current, "isMany", true, "*");
                    	    

                    }


                    }
                    break;

            }


            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUmlAssociation"


    // $ANTLR start "entryRuleUmlAttribute"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:298:1: entryRuleUmlAttribute returns [EObject current=null] : iv_ruleUmlAttribute= ruleUmlAttribute EOF ;
    public final EObject entryRuleUmlAttribute() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUmlAttribute = null;


        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:299:2: (iv_ruleUmlAttribute= ruleUmlAttribute EOF )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:300:2: iv_ruleUmlAttribute= ruleUmlAttribute EOF
            {
             newCompositeNode(grammarAccess.getUmlAttributeRule()); 
            pushFollow(FOLLOW_ruleUmlAttribute_in_entryRuleUmlAttribute570);
            iv_ruleUmlAttribute=ruleUmlAttribute();

            state._fsp--;

             current =iv_ruleUmlAttribute; 
            match(input,EOF,FOLLOW_EOF_in_entryRuleUmlAttribute580); 

            }

        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUmlAttribute"


    // $ANTLR start "ruleUmlAttribute"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:307:1: ruleUmlAttribute returns [EObject current=null] : ( ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (lv_type_2_0= ruleBuiltInTypes ) ) ( (lv_isMany_3_0= '*' ) )? ) ;
    public final EObject ruleUmlAttribute() throws RecognitionException {
        EObject current = null;

        Token lv_name_0_0=null;
        Token otherlv_1=null;
        Token lv_isMany_3_0=null;
        Enumerator lv_type_2_0 = null;


         enterRule(); 
            
        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:310:28: ( ( ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (lv_type_2_0= ruleBuiltInTypes ) ) ( (lv_isMany_3_0= '*' ) )? ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:311:1: ( ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (lv_type_2_0= ruleBuiltInTypes ) ) ( (lv_isMany_3_0= '*' ) )? )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:311:1: ( ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (lv_type_2_0= ruleBuiltInTypes ) ) ( (lv_isMany_3_0= '*' ) )? )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:311:2: ( (lv_name_0_0= RULE_ID ) ) otherlv_1= ':' ( (lv_type_2_0= ruleBuiltInTypes ) ) ( (lv_isMany_3_0= '*' ) )?
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:311:2: ( (lv_name_0_0= RULE_ID ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:312:1: (lv_name_0_0= RULE_ID )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:312:1: (lv_name_0_0= RULE_ID )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:313:3: lv_name_0_0= RULE_ID
            {
            lv_name_0_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUmlAttribute622); 

            			newLeafNode(lv_name_0_0, grammarAccess.getUmlAttributeAccess().getNameIDTerminalRuleCall_0_0()); 
            		

            	        if (current==null) {
            	            current = createModelElement(grammarAccess.getUmlAttributeRule());
            	        }
                   		setWithLastConsumed(
                   			current, 
                   			"name",
                    		lv_name_0_0, 
                    		"ID");
            	    

            }


            }

            otherlv_1=(Token)match(input,16,FOLLOW_16_in_ruleUmlAttribute639); 

                	newLeafNode(otherlv_1, grammarAccess.getUmlAttributeAccess().getColonKeyword_1());
                
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:333:1: ( (lv_type_2_0= ruleBuiltInTypes ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:334:1: (lv_type_2_0= ruleBuiltInTypes )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:334:1: (lv_type_2_0= ruleBuiltInTypes )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:335:3: lv_type_2_0= ruleBuiltInTypes
            {
             
            	        newCompositeNode(grammarAccess.getUmlAttributeAccess().getTypeBuiltInTypesEnumRuleCall_2_0()); 
            	    
            pushFollow(FOLLOW_ruleBuiltInTypes_in_ruleUmlAttribute660);
            lv_type_2_0=ruleBuiltInTypes();

            state._fsp--;


            	        if (current==null) {
            	            current = createModelElementForParent(grammarAccess.getUmlAttributeRule());
            	        }
                   		set(
                   			current, 
                   			"type",
                    		lv_type_2_0, 
                    		"BuiltInTypes");
            	        afterParserOrEnumRuleCall();
            	    

            }


            }

            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:351:2: ( (lv_isMany_3_0= '*' ) )?
            int alt6=2;
            int LA6_0 = input.LA(1);

            if ( (LA6_0==17) ) {
                alt6=1;
            }
            switch (alt6) {
                case 1 :
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:352:1: (lv_isMany_3_0= '*' )
                    {
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:352:1: (lv_isMany_3_0= '*' )
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:353:3: lv_isMany_3_0= '*'
                    {
                    lv_isMany_3_0=(Token)match(input,17,FOLLOW_17_in_ruleUmlAttribute678); 

                            newLeafNode(lv_isMany_3_0, grammarAccess.getUmlAttributeAccess().getIsManyAsteriskKeyword_3_0());
                        

                    	        if (current==null) {
                    	            current = createModelElement(grammarAccess.getUmlAttributeRule());
                    	        }
                           		setWithLastConsumed(current, "isMany", true, "*");
                    	    

                    }


                    }
                    break;

            }


            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUmlAttribute"


    // $ANTLR start "ruleBuiltInTypes"
    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:374:1: ruleBuiltInTypes returns [Enumerator current=null] : ( (enumLiteral_0= 'Boolean' ) | (enumLiteral_1= 'Integer' ) | (enumLiteral_2= 'String' ) ) ;
    public final Enumerator ruleBuiltInTypes() throws RecognitionException {
        Enumerator current = null;

        Token enumLiteral_0=null;
        Token enumLiteral_1=null;
        Token enumLiteral_2=null;

         enterRule(); 
        try {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:376:28: ( ( (enumLiteral_0= 'Boolean' ) | (enumLiteral_1= 'Integer' ) | (enumLiteral_2= 'String' ) ) )
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:377:1: ( (enumLiteral_0= 'Boolean' ) | (enumLiteral_1= 'Integer' ) | (enumLiteral_2= 'String' ) )
            {
            // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:377:1: ( (enumLiteral_0= 'Boolean' ) | (enumLiteral_1= 'Integer' ) | (enumLiteral_2= 'String' ) )
            int alt7=3;
            switch ( input.LA(1) ) {
            case 18:
                {
                alt7=1;
                }
                break;
            case 19:
                {
                alt7=2;
                }
                break;
            case 20:
                {
                alt7=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 7, 0, input);

                throw nvae;
            }

            switch (alt7) {
                case 1 :
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:377:2: (enumLiteral_0= 'Boolean' )
                    {
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:377:2: (enumLiteral_0= 'Boolean' )
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:377:4: enumLiteral_0= 'Boolean'
                    {
                    enumLiteral_0=(Token)match(input,18,FOLLOW_18_in_ruleBuiltInTypes742); 

                            current = grammarAccess.getBuiltInTypesAccess().getBOOLEANEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
                            newLeafNode(enumLiteral_0, grammarAccess.getBuiltInTypesAccess().getBOOLEANEnumLiteralDeclaration_0()); 
                        

                    }


                    }
                    break;
                case 2 :
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:383:6: (enumLiteral_1= 'Integer' )
                    {
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:383:6: (enumLiteral_1= 'Integer' )
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:383:8: enumLiteral_1= 'Integer'
                    {
                    enumLiteral_1=(Token)match(input,19,FOLLOW_19_in_ruleBuiltInTypes759); 

                            current = grammarAccess.getBuiltInTypesAccess().getINTEGEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
                            newLeafNode(enumLiteral_1, grammarAccess.getBuiltInTypesAccess().getINTEGEREnumLiteralDeclaration_1()); 
                        

                    }


                    }
                    break;
                case 3 :
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:389:6: (enumLiteral_2= 'String' )
                    {
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:389:6: (enumLiteral_2= 'String' )
                    // ../de.fhdw.seminar.xtext/src-gen/de/fhdw/seminar/xtext/parser/antlr/internal/InternalUmlDsl.g:389:8: enumLiteral_2= 'String'
                    {
                    enumLiteral_2=(Token)match(input,20,FOLLOW_20_in_ruleBuiltInTypes776); 

                            current = grammarAccess.getBuiltInTypesAccess().getSTRINGEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
                            newLeafNode(enumLiteral_2, grammarAccess.getBuiltInTypesAccess().getSTRINGEnumLiteralDeclaration_2()); 
                        

                    }


                    }
                    break;

            }


            }

             leaveRule(); 
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleBuiltInTypes"

    // Delegated rules


 

    public static final BitSet FOLLOW_ruleUmlModel_in_entryRuleUmlModel75 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleUmlModel85 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleUmlClass_in_ruleUmlModel130 = new BitSet(new long[]{0x0000000000001802L});
    public static final BitSet FOLLOW_ruleUmlClass_in_entryRuleUmlClass166 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleUmlClass176 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_11_in_ruleUmlClass219 = new BitSet(new long[]{0x0000000000001000L});
    public static final BitSet FOLLOW_12_in_ruleUmlClass245 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleUmlClass262 = new BitSet(new long[]{0x0000000000006000L});
    public static final BitSet FOLLOW_13_in_ruleUmlClass280 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleUmlClass300 = new BitSet(new long[]{0x0000000000004000L});
    public static final BitSet FOLLOW_14_in_ruleUmlClass314 = new BitSet(new long[]{0x0000000000008010L});
    public static final BitSet FOLLOW_ruleUmlAssociation_in_ruleUmlClass336 = new BitSet(new long[]{0x0000000000008010L});
    public static final BitSet FOLLOW_ruleUmlAttribute_in_ruleUmlClass363 = new BitSet(new long[]{0x0000000000008010L});
    public static final BitSet FOLLOW_15_in_ruleUmlClass377 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleUmlAssociation_in_entryRuleUmlAssociation413 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleUmlAssociation423 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleUmlAssociation465 = new BitSet(new long[]{0x0000000000010000L});
    public static final BitSet FOLLOW_16_in_ruleUmlAssociation482 = new BitSet(new long[]{0x0000000000000010L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleUmlAssociation502 = new BitSet(new long[]{0x0000000000020002L});
    public static final BitSet FOLLOW_17_in_ruleUmlAssociation520 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ruleUmlAttribute_in_entryRuleUmlAttribute570 = new BitSet(new long[]{0x0000000000000000L});
    public static final BitSet FOLLOW_EOF_in_entryRuleUmlAttribute580 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_RULE_ID_in_ruleUmlAttribute622 = new BitSet(new long[]{0x0000000000010000L});
    public static final BitSet FOLLOW_16_in_ruleUmlAttribute639 = new BitSet(new long[]{0x00000000001C0000L});
    public static final BitSet FOLLOW_ruleBuiltInTypes_in_ruleUmlAttribute660 = new BitSet(new long[]{0x0000000000020002L});
    public static final BitSet FOLLOW_17_in_ruleUmlAttribute678 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_18_in_ruleBuiltInTypes742 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_19_in_ruleBuiltInTypes759 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_20_in_ruleBuiltInTypes776 = new BitSet(new long[]{0x0000000000000002L});

}